package com.example.sams.config;

import com.example.sams.interceptor.JwtInterceptor;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration // 标记为Spring配置类，替代传统xml配置
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private JwtInterceptor jwtInterceptor; // 注入步骤1创建的拦截器

    /**
     * 配置 Jackson ObjectMapper，确保 null 值也被包含在 JSON 响应中
     */
    @Bean
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        return new Jackson2ObjectMapperBuilder()
                .serializationInclusion(JsonInclude.Include.ALWAYS); // 始终包含 null 值
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor)
                // 1. 需要拦截的接口（所有需要权限的接口）
//                .addPathPatterns("/admin/**")    // 管理员接口（如/admin/addUser）
//                .addPathPatterns("/teacher/**")  // 教师接口（后续扩展）
//                .addPathPatterns("/student/**")  // 学生接口（后续扩展）
                // 2. 排除拦截的接口（无需登录即可访问的接口）
                .excludePathPatterns("/**/login")   // 登录接口（必须放行，否则无法登录）
                .excludePathPatterns("/actuator/**") // Actuator 健康检查接口
                // 3. 排除静态资源（前端HTML/CSS/JS，避免页面加载失败）
                .excludePathPatterns("/**/*.html")
                .excludePathPatterns("/**/*.css")
                .excludePathPatterns("/**/*.js");
    }

    /**
     * 配置 CORS 跨域支持
     * 允许前端访问后端 API（支持多个端口）
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:5174", "http://localhost:5175", 
                               "http://localhost:5176", "http://localhost:5177",
                               "http://localhost:5178", "http://localhost:5179") // 允许的前端地址（支持多个端口）
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH") // 允许的HTTP方法
                .allowedHeaders("*") // 允许所有请求头
                .allowCredentials(true) // 允许携带凭证（如 Cookie、Authorization）
                .maxAge(3600); // 预检请求的缓存时间（秒）
    }
}